home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / misc / amag / AM9402_2.lha / blitz-basic / listing1.bb2 next >
Text File  |  1993-12-30  |  4KB  |  168 lines

  1. ;
  2. ; Dancing BlitzMan v0.0 by Simon Armstrong
  3. ;
  4.  
  5. NEWTYPE .seg
  6.   *kid.seg         ;Zeigt auf den ersten Eintrag
  7.   *bro.seg         ;Verbindet alle Einträge
  8.   x.w:y:a
  9.   angle.w:length   ;Polarkoordinaten fürs Zeichnen
  10. End NEWTYPE
  11.  
  12. Dim qsin.q(256),qcos.q(256)
  13. Dim List segs.seg(500)
  14. Dim *f.seg(20)
  15.  
  16. DEFTYPE .seg *myman
  17.  
  18. Statement readfigure{*temp.seg}
  19.   SHARED segs()
  20.   Read numkids.w       ;nächsten Eintrag lesen
  21.   Read *temp\angle
  22.   Read *temp\length
  23.   *prev.seg=0
  24.   For i=1 To numkids   ;Nut wenn Kinder existieren
  25.     AddItem segs()     ;Neues Element holen
  26.     segs()\bro=*prev   ;Mit Vorgänger verbinden
  27.     *prev=segs()       ;Vorgänger zum aktuellen machen
  28.     readfigure{segs()} ;Und neue Daten lesen
  29.   Next
  30.   *temp\kid=*prev      ;Verbinden aller Einträge
  31. End Statement
  32.  
  33. Statement drawfigure{x.w,y,a,*temp.seg}
  34.   SHARED qsin(),qcos(),ratio,size
  35.   USEPATH *temp
  36.   ;Winkel und berechnete Länge des Glieds einfügen
  37.   aa=(a+\angle)&255:slen=\length*size
  38.   ;Polar- in kartesische Koordinaten konvertieren
  39.   xx=x+qcos(aa)*slen:yy=y+qsin(aa)*slen
  40.   \x=xx,yy,aa                 ;Für findpart{} sichern
  41.   If \length<0                ;Kreis
  42.     WEllipse xx,yy,-slen,-slen*ratio,1
  43.   Else
  44.     Wline x,y,xx,yy,1         ;Linie
  45.   EndIf
  46.   ;Anfügen eines Kreises, der mit der Maus ange-
  47.   ;klickt werden kann
  48.   WEllipse xx,yy,size*2,size*2*ratio,2
  49.   ;rekursive Aufrufe der weiteren Glieder
  50.   If \kid Then drawfigure{xx,yy,aa,\kid}
  51.   If \bro Then drawfigure{x,y,a,\bro}
  52. End Statement
  53.  
  54. Function.l findpart{x,y,*temp.seg}
  55.   DEFTYPE .l result
  56.   USEPATH *temp
  57.   If RectsHit(x,y,1,1,\x-2,\y-2,5,5)  ;Hot-Spot?
  58.     Function Return *temp             ;Exit
  59.   Else
  60.     If \kid Then result=findpart{x,y,\kid}
  61.     If result Then Function Return result
  62.     If \bro Then result=findpart{x,y,\bro}
  63.   EndIf
  64. End Statement
  65.  
  66. ;
  67. ; Hauptprogramm
  68. ;
  69.  
  70. MaxLen pa$=160 ;Pfad für den Datei-Requester
  71. MaxLen fi$=64  ;Pfad für den Dateinamen
  72.  
  73. ratio=.5  ;Bildpunktverhältnis Hires Non-Interlace
  74.  
  75. For i=0 To 255
  76.   qsin(i)=Sin(i*Pi/128)*ratio:qcos(i)=Cos(i*Pi/128)
  77. Next
  78.  
  79. Screen 0,10,"IF I WERE A BLITZMAN"
  80.  
  81. MenuTitle 0,0,"PROJECT"
  82. MenuItem 0,0,0,0,"LOAD MED      ","L"
  83. MenuItem 0,0,0,1,"START MED     ","S"
  84. MenuItem 0,0,0,2,"QUIT          ","Q"
  85.  
  86. g=0
  87. For y=0 To 3:For x=0 To 4
  88.   PropGadget 0,300+x*64,6+y*32,1,g,60,30:g+1
  89. Next:Next
  90.  
  91. ;Großes Fenster nach hinten
  92. Window 0,0,10,640,246,$1000,"",1,2,0:SetMenu 0
  93. ;Editier-Fenster
  94. Window 1,16,14,256,128,$1000,"",1,2:SetMenu 0
  95.  
  96. SetInt 5:PlayMed:End SetInt
  97.  
  98. Repeat
  99.   ev.l=WaitEvent
  100.   Select ev
  101.     Case 8
  102.       If EventWindow=1 Then Gosub editman
  103.     Case $40
  104.       If GadgetHit<20 Then Gosub selectframe
  105.     Case $100
  106.       If MenuHit=0 AND ItemHit=0 Then Gosub loadmed
  107.       If MenuHit=0 AND ItemHit=1 Then StartMedModule 0
  108.       If MenuHit=0 AND ItemHit=2 Then End
  109.   End Select
  110. Forever
  111.  
  112. .selectframe    ;weist *myman den aktuellen oder neuen
  113.                 ;Rahmen zu
  114.   gman=GadgetHit
  115.   gadgetx=300+(gman MOD 5)*64:gadgety=6+Int(gman/5)*32
  116.   If *f(gman)=0
  117.     AddItem segs():*f(gman)=segs():Restore mandata:
  118.     readfigure{*f(gman)}
  119.   EndIf
  120.   *myman=*f(gman)
  121.   Gosub refreshgman
  122.   Return
  123.  
  124. .refreshgman    ;Neu zeichnen eines Rahmens
  125.   Use Window 0
  126.   WBox gadgetx+4,gadgety+2,gadgetx+55,gadgety+27,0
  127.   size=.25:drawfigure {gadgetx+30,gadgety+16,0,*myman}
  128.   Use Window 1:InnerCls:size=1:
  129.     drawfigure {128,64,0,*myman}
  130.   Return
  131.  
  132. .editman:    ;Überprüfen auf korrekten Mausklick
  133.              ;und modifizieren des Winkels
  134.   Use Window 1
  135.   *part.seg=findpart{WMouseX,WMouseY,*myman}
  136.   If *part<>0
  137.     USEPATH *part
  138.     wx=WMouseX:wa=\angle:Use Window 1
  139.     While Joyb(0)<>0
  140.       \angle=wa+wx-WMouseX:InnerCls:
  141.         drawfigure {128,64,0,*myman}:VWait 10
  142.     Wend
  143.     Gosub refreshgman
  144.   EndIf
  145.   While Joyb(0)<>0 Wend
  146.   Return
  147.  
  148. .loadmed:
  149.   a$=FileRequest$("SELECT MED MODULE TO LOAD",pa$,fi$)
  150.   If a$<>"" Then LoadMedModule 0,a$
  151.   Return
  152.  
  153. .mandata:                ;Anzahl der Verzweigungen,
  154.                          ;Winkel und Länge (13 Glieder)
  155.   Data.w 3,0,0           ;Ursprung
  156.     Data.w 1,32,40       ;rechter Oberschenkel
  157.       Data.w 1,48,40     ;rechter Unterschenkel
  158.         Data.w 0,-80,16  ;rechter Fuß
  159.     Data.w 1,96,40       ;linker Oberschenkel
  160.       Data.w 1,-48,40    ;linker Unterschenkel
  161.         Data.w 0,80,16   ;linker Fuß
  162.     Data.w 3,192,20      ;Rückgrat
  163.       Data.w 1,76,40     ;rechter Oberarm
  164.         Data.w 0,32,30   ;rechter Unterarm
  165.       Data.w 1,192,40    ;linker Oberarm
  166.         Data.w 0,32,30   ;linker Unterarm
  167.       Data.w 0,128,-20   ;Kopf
  168.